home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-12-11 | 8.6 KB | 353 lines | [TEXT/ttxt] |
- --<<<-
-
- global PopUpButton
-
- class PopUpMenu(Menu)
- class variables
- mouse:(new MouseDevice)
- instance variables
- selectAction
- authorData:(undefined)
- _selectedLine:0
- selection
-
- upInterest
-
- stepAmount:0
- tempPoint:(new Point)
- frame:(new Frame)
- _list
- end
-
- method init self {class PopUpMenu} #rest args #key \
- width: \
- boundary: \
- list:(#()) \
- font:(theSystemFont) ->
- (
- self.stepAmount := font.leading
- if (boundary == unsupplied) then
- boundary := new Rect x2:width y2:(font.leading+2)
- else if (width != unsupplied) do
- boundary.width := width
- local targetPresenter := apply new ListBox width:boundary.width args
- apply NextMethod self boundary:boundary actuatorController:undefined \
- targetPresenter:targetPresenter layoutController:undefined args
- self.selection := new ListSelection font:font \
- width:self.width parent:targetPresenter
- self.list := list
-
- local upInterest := new MouseUpEvent
- self.upInterest := upInterest
- upInterest.eventReceiver := upReceiver;
- upInterest.buttons := @mouseButton1
- upInterest.authordata := self
- upInterest.presenter := undefined -- global move interest -- not associated with presenter
- upInterest.priority := 6
- )
-
- method afterInit self {class PopUpMenu} #rest args ->
- (
- apply NextMethod self args
- local cp := self.clippingPresenter
- InsetRect cp.boundary 2 2 @mutate
- cp.stationary := true
- cp.fill := ColorScheme.grayBrushes[4]
- self.stationary := true
- self.horizScrollBarDisplayed := self.vertScrollBarDisplayed := @none
- self.selectedLine := 1
- )
-
- method draw self {class PopUpMenu} surface clip ->
- (
- NextMethod self surface clip
- drawRaisedFrame self.frame surface clip self.globalTransform
- )
-
- method recalcRegion self {class PopUpMenu} ->
- (
- NextMethod self
- SetBoundary self.frame self.boundary
- )
-
- method tickle self {class PopUpMenu} clock ->
- (
- local targetP := self.targetPresenter
- local tempPoint := self.tempPoint
- local screenCoords := PopUpMenu.mouse.currentCoords
- setTo tempPoint screenCoords
- ScreenToDisplay self.window.displaySurface tempPoint @mutate
- SurfaceToLocal self tempPoint @mutate
- local bbox := self.clippingPresenter.boundary
- local y1 := bbox.y1
- local y2 := bbox.y2
- local mouseY := tempPoint.y
- local sel := self.selection
-
- if (inside bbox tempPoint) then
- show sel
- else
- hide sel
- if (mouseY < y1) then (
- if (self._selectedLine > 0) do
- repeatScrollAction self targetP @up
- )
- else if (mouseY > y2) then (
- if (self._selectedLine < self.numLines) do (
- repeatScrollAction self targetP @down
- )
- )
- else (
- LocalToSurface self tempPoint @mutate
- SurfaceToLocal targetP tempPoint @mutate
- self.selectedLine := \
- (((tempPoint.y - 2)/self.stepAmount) as ImmediateInteger) + 1
- )
- )
-
- method repeatScrollAction self {class PopUpMenu} targetPresenter direction ->
- (
- local y := -targetpresenter.y
- local newY := self.stepAmount
- if (direction = @up) then (
- newY := y - newY
- )
- else if (direction = @down) do (
- newY := y + newY
- )
- scrollTo self 0 newY
- )
-
- method upReceiver self {class PopUpMenu} theInterest event ->
- (
- self.needsTickle := false
- removeEventInterest self.upInterest
- local sel := self.selection
- if (sel.isVisible) then (
- local invoker := self.invoker
- local selectAction := self.selectAction
- if (selectAction != undefined) do
- selectAction self.authorData self._selectedLine
- if (isAKindOf invoker PopUpButton) do (
- invoker.value := self.value
- )
- )
- else (
- show sel
- )
- hide self
- @accept
- )
-
- method layout self {class PopUpMenu} ->
- (
- NextMethod self
- local cp := self.clippingPresenter
- cp.width := cp.width - 4
- cp.height := cp.height - 4
- self
- )
-
- method popUp self {class PopUpMenu} invoker superMenu point ->
- (
- NextMethod self invoker superMenu point
- self.needsTickle := true
- addEventInterest self.upInterest
- )
-
- method calculateSize self {class PopUpMenu} ->
- (
- local invoker := self.invoker
- local topPresenter := invoker.window
- if (topPresenter != undefined) do (
- local targetP := self.targetPresenter
- local targetHt := targetP.height
- local topHt := topPresenter.height
- if (targetHt > topHt ) then
- self.height := topHt
- else
- self.height := targetHt
- )
- )
-
- method place self {class PopUpMenu} pt ->
- (
- NextMethod self pt
- local invoker := self.invoker
- if (isAKindOf invoker PopUpButton) do (
- local y := self.y
- local invokerY := invoker.y
- if (y > invokerY) do (
- self.y := invokerY + 3
- )
- self.x := invoker.x + 3
- )
- )
-
- method fontGetter self {class PopUpMenu} -> self.targetPresenter.font
- method fontSetter self {class PopUpMenu} newFont ->
- (
- self.targetPresenter.font := newFont
- self.stepAmount := newFont.leading
- changeFont self.selection newFont self._selectedLine
- layout self
- newFont
- )
-
-
- method selectedLineGetter self {class PopUpMenu} ->
- self._selectedLine
-
- method selectedLineSetter self {class PopUpMenu} newLine ->
- (
- if (newLine <> self._selectedLine and newLine > 0 and \
- newLine <= self.numLines ) then (
- ThreadCriticalUp()
- selectLine self.selection newLine @dontAction
- self._selectedLine := newLine
- local lineHt := self.stepAmount
- local startLine := round(-self.targetPresenter.y/lineHt) + 1
- local endLine := \
- (startLine + (self.height - 5 + lineHt)/lineHt - 1) as ImmediateInteger
- if (newLine < startLine or newLine >= endLine) do (
- ScrollTo self 0 ((newLine - 1)*lineHt)
- )
- ThreadCriticalDown()
- )
- newLine
- )
-
- method numLinesGetter self {class PopUpMenu} -> self.targetPresenter.numLines
-
- method widthSetter self {class PopUpMenu} newWidth->
- (
- self.selection.width := newWidth
- self.targetPresenter.width := newWidth
- NextMethod self newWidth
- )
-
- method valueGetter self {class PopUpMenu} ->
- (
- GetNthKey self._list self._selectedLine
- )
-
- method valueSetter self {class PopUpMenu} newValue ->
- (
- local scrollList := self._list
- self.selectedLine := (GetOrdOne scrollList newValue)
- newValue
- )
-
- method listGetter self {class PopUpMenu} -> self._list
- method listSetter self {class PopUpMenu} newList ->
- (
- self._list := self.targetPresenter.list := newList
- self.selectedLine := 1
- layout self
- newList
- )
-
- method fillGetter self {class PopUpMenu} -> self.clippingPresenter.fill
- method fillSetter self {class PopUpMenu} newFill ->
- (
- self.clippingPresenter.fill := newFill
- NextMethod self undefined
- )
-
- class PopUpButton(TextButton)
- class variables
- popPict:(importDIB "media/popup.bmp")
- end
-
- method init self {class PopUpButton} #rest args #key\
- boundary: menu: \
- value: ->
- (
- apply NextMethod self stencil:PopUPButton.popPict args
- self.buttonFrame.scheme := menu.frame.scheme := theMenuScheme
- self.font := menu.font
- if (boundary == unsupplied) do (
- self.width := menu.width + 6
- self.height := menu.font.leading + 8
- )
- self.menu := menu
- if (value != unsupplied) do (
- local scrollList := menu._list
- local item := GetOne scrollList value
- self.text := item as Text
- menu._selectedLine := (GetOrdOne scrollList item)
- )
- )
-
- method recalcRegion self {class PopUpButton} ->
- (
- NextMethod self
- local stencil := self._stencil
- local border := self.border
- local stencilTrans := self.stencilTransform
- local gTrans := self.globalTransform
- SetTo stencilTrans gTrans
- local xOffset := border.x2 - stencil.width - 4
- local yOffset := border.y1 + (border.height - stencil.height)/2
- translate stencilTrans xOffset yOffset
- local textTrans := self.textTransform
- SetTo textTrans gTrans
- local fontInfo := self.font
- local leading := fontInfo.leading
- local descent := fontInfo.descent
- local yOffset := border.y1 + (border.height - 4 - leading) / 2 + leading - descent + 1
- translate textTrans (border.x1 + 4) yOffset
- )
-
- method draw self {class PopUpButton} surface clip ->
- (
- if (not self.pressed) then
- NextMethod self surface clip
- else (
- local transform := self.globalTransform
- drawLoweredFrame self.recessedFrame surface clip transform
- stroke surface self.border clip transform ColorScheme.grayBrushes[2]
- )
- )
-
- method menuSetter self {class PopUpButton} newMenu ->
- (
- self.text := (GetOne newMenu._list newMenu.value) as Text
- NextMethod self newMenu
- )
-
- method widthSetter self {class PopUpButton} newWidth ->
- (
- self.menu.width := newWidth - 6
- NextMethod self newWidth
- )
-
- method valueGetter self {class PopUpButton} -> self.menu.value
- method valueSetter self {class PopUpButton} newValue ->
- (
- local menu := self.menu
- menu.value := newValue
- self.text := (GetOne menu._list newValue) as Text
- newValue
- )
-
- method fontSetter self {class PopUpButton} newFont ->
- (
- NextMethod self newFont
- self.menu.font := newFont
- )
-
- method listGetter self {class PopUpButton} -> self.menu._list
- method listSetter self {class PopUpButton} newList ->
- (
- local menu := self.menu
- local val
-
- menu.list := newList
- val := menu.value
- self.text := (if (val == empty) then val else (GetOne menu._list val)) as Text
- newList
- )
-
- -->>>
-